package main

import "sync"

// 实现链表队列

type LinkQueue struct {
	root *LinkNode  	// 链表头节点
	size int			// 队列的元素数量
	lock sync.Mutex		// 为了并发安全使用的锁
}


type LinkNode struct {
	Next *LinkNode
	Value string
}


// 入队操作
func (queue *LinkQueue) Add(v string) {
	queue.lock.Lock()
	defer queue.lock.Unlock()

	// 如果链队列头节点为nil，那么增加节点
	if queue.root == nil {
		queue.root = new(LinkNode)
		queue.root.Value = v
	} else {
		// 新元素插入链表的尾部（尾插法）
		newNode := new(LinkNode)
		newNode.Value = v

		nowNode := queue.root
		for nowNode.Next != nil {
			nowNode = nowNode.Next
		}

		// 放入新节点
		nowNode.Next = newNode

		// 队中元素数量 + 1
		queue.size = queue.size + 1
	}
}

// Remove 出队操作
func (queue *LinkQueue) Remove() string {
	queue.lock.Lock()
	queue.lock.Unlock()

	// 如果队中元素已空
	if queue.size == 0 {
		panic("empty")
	}

	// 顶部元素出队
	topNode := queue.root
	v := topNode.Value

	queue.root = topNode.Next

	// 队中元素数量 - 1
	queue.size = queue.size - 1
	return v
}





func main() {


}
